#include "Servidor.h"
#include <algorithm>

Servidor::Servidor(int puerto)
{
	this->socket = new Socket(puerto);
	estado = false;
	idPartida = 0;
}

Servidor::~Servidor(void) {
	this->stop();
}

void Servidor::Start() {
	estado = true;
	//socket->escuchar();
	//this->socket = new Socket(puerto);
	this->start();
}

void Servidor::Stop() {
	delete(socket);
	estado = false;
	this->stop();
}

void Servidor::ejecutar() {
	std::vector<GestorDeCliente*> gestores;
	Socket* un_socket;
	// Escuchamos e instanciamos usuarios hasta que el estado del servidor cambie
	do {
		//if((conectado = conexion->acceptarConexion()) != NULL) {
		if((un_socket = socket->aceptarConexiones()) != NULL) {
			GestorDeCliente *u = new GestorDeCliente(un_socket, &partidas, this);
			gestores.push_back(u);
			u->Start();
		}
	} while(estado);
	// Al detenerse el servidor, destruye los usuarios conectados:
	unsigned int i = 0;
	while (i < gestores.size()) {
		delete(gestores[i]);
		++i;
	}
}

short Servidor::getProximoId() {
	return idPartida++;
}

PartidaMultijugador* Servidor::crearPartida(GestorDeCliente *creador, short nivel, short cantidadDeJugadores){
	mutexCrearPartida.lock();
	PartidaMultijugador* p = new PartidaMultijugador(creador, nivel, cantidadDeJugadores, getProximoId());
	partidas.push_back(p);
	mutexCrearPartida.unlock();
	return p;
}

void Servidor::matarPartida (PartidaMultijugador* partida){
	mutexCrearPartida.lock();
	partidas.erase(remove(partidas.begin(), partidas.end(), partida), partidas.end());
	delete(partida);
	mutexCrearPartida.unlock();
}
